# 多阶段构建 Dockerfile
# 阶段1: 构建阶段
FROM node:20-alpine AS builder

# 安装 git
RUN apk add --no-cache git

# 设置工作目录
WORKDIR /app

# 从 Gitee 拉取代码
RUN git clone -b master https://f0541b04bb9c1e0709b7ef5bed2807cc@gitee.com/wang_dongsheng/what-to-eat-server.git .

# 安装 pnpm
RUN npm install -g pnpm

# 安装依赖
RUN pnpm install --frozen-lockfile

# 构建应用
RUN pnpm build

# 阶段2: 生产阶段
FROM node:20-alpine AS production

# 安装 dumb-init 用于正确处理信号
RUN apk add --no-cache dumb-init

# 创建非 root 用户
RUN addgroup -g 1001 -S nodejs
RUN adduser -S nestjs -u 1001

# 设置工作目录
WORKDIR /app

# 从构建阶段复制 package 文件
COPY --from=builder /app/package*.json ./
COPY --from=builder /app/pnpm-lock.yaml ./

# 安装 pnpm
RUN npm install -g pnpm

# 只安装生产依赖（不包含 devDependencies）
# 这是必要的，因为生产镜像需要运行时依赖，但不需要开发依赖
RUN pnpm install --prod --frozen-lockfile && pnpm store prune

# 从构建阶段复制构建产物
COPY --from=builder --chown=nestjs:nodejs /app/dist ./dist

# 复制健康检查脚本
COPY --from=builder --chown=nestjs:nodejs /app/healthcheck.js ./

# 切换到非 root 用户
USER nestjs

# 暴露端口
EXPOSE 3000

# 健康检查
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
  CMD node healthcheck.js

# 启动应用
ENTRYPOINT ["dumb-init", "--"]
CMD ["node", "dist/main"]